<?php
/*
 * @Description: 
 */

namespace app\controller;

use app\BaseController;
use app\model\UserModel;

class TestUser extends BaseController
{
  public function index()
  {
    $userModel = new UserModel();
    $data = $userModel->select();
    return json($data);
  }

  public function add()
  {
    // 使用实例化的方式添加一条数据，并使用 **save()** 方法进行保存；
    $userModel = new UserModel();
    // $userModel -> name = 'test';
    // $userModel -> save();
    // 通过 **save()** 传递数据数组的方式，来新增数据；

    // $data = [
    //   'name' => 'test',
    //   'age' => 22,
    //   'gender' => '男',
    //   'details' => '测试',
    // ];


    // 使用 **allowField()** 方法，允许要写入的字段，其它字段就无法写入了；
    // $userModel -> allowField(['name', 'age', 'gender', ])
    //   -> save([
    //     'name' => 'test2',
    //     'age' => 22,
    //     'gender' => '男',
    //     'details' => '测试2',
    //   ]);

    // 模型新增也提供了 **replace()** 方法来实现 **REPLACE into** 新增；
    // $userModel -> replace() -> save([
    //   'name' => 'test2',
    //   'age' => 22,
    //   'gender' => '男',
    //   'details' => '测试2',
    // ]);

    // 使用 saveAll()方法，可以批量新增数据，返回批量新增的数组；
    // $userModel->saveAll(
    //   [
    //     [
    //       "name"  =>  "赵六",
    //       "age"   =>  19,
    //       "gender" =>  "男"
    //     ],
    //     [
    //       "name"  =>  "钱七",
    //       "age"   =>  22,
    //       "gender" =>  "男",
    //       "details"   =>  "我很有钱，排行老七！"
    //     ],
    //     [
    //       "name"  =>  "孙八",
    //       "age"   =>  25,
    //       "gender" =>  "男",
    //       "details"   =>  "我很有钱，排行老八！"
    //     ]
    //   ]
    // );


    // 使用 **::create()** 静态方法，来创建要新增的数据；
    $user = $userModel::create([
      'name'  =>  '张三',
      'age'   =>  18,
      'gender' =>  '男',
      'details'   =>  '我很有钱，排行老三！'
    ],["name", "age", "gender", "details"]);
    //参数 1 是新增数据数组，必选
    //参数 2 是允许写入的字段，可选
    //参数 3 为是否 replace 写入，可选，默认 false 为 Insert 写入

    // 当新增成功后，使用 **$user->id** ，可以获得自增 ID（主键需是 id）
    return $user->id;
  }

  // 删除
  public function del()
  {
    $userModel = new UserModel();
    // 单个删除
    $userModel->destroy(148);
    // 批量删除
    // $userModel->destroy([149, 150]);

    // 条件删除
    // $userModel->destroy(['id' => ['>', 148]]);

    // 闭须使用软删除包删除
    // $userModel->destroy(function ($query) {
    //   $query->where('id', '>', 148);
    // });

    // 软删除
    // UserModel::destroy(1);
    // // 真实删除
    // UserModel::destroy(1,true);

    // UserModel::find(1);
    // // 软删除
    // UserModel::delete();
    // // 真实删除
    // $userModel->force()->delete();

    // 软删除后，数据库内的数据只是被标记了删除时间，而搜索数据时，会自动屏蔽这些数据；
    // 在开启软删除功能的前提下，使用 **withTrashed()** 方法取消屏蔽软删除的数据；
    // $userModel->withTrashed()->select();

    // 如果只想查询被软删除的数据，使用 onlyTrashed()方法即可；
    // $userModel->onlyTrashed()->select()

    // 如果想让某一条被软删除的数据恢复到正常数据，可以使用 restore()方法；
    // $user = $userModel->onlyTrashed()->find(23);
    // $userModel->onlyTrashed()->find(23)->restore();
    return $userModel->getLastSql();
  }

  // 模型更新
  public function update()
  {
    $userModel = new UserModel();
    // 使用 find()方法获取数据，然后通过 save()方法保存修改，返回布尔值；

    $user = $userModel->find(1);
    // $user->name = 'updateduser';
    // $user->age = 25;
    // $user->save();

    // 使用 find()方法获取数据，然后通过 save()方法保存修改，返回布尔值；
    $user = $userModel::where('id', 1)->find();
    $user->name = '修改测试';
    $user->save();
    // - save()方法只会更新变化的数据，如果提交的修改数据没有变化，则不更新；
    // - 但如果你想强制更新数据，即使数据一样，那么可以使用 force()方法；
    $user->force()->save([
      'name' => '强制更新测试',
      'age' => 20,
    ]);

    // 使用静态方法::update()更新，返回的是对象实例；
    $user = $userModel::update([
      'name' => '静态方法测试',
      'age' => 20,
      'id' => 2,
    ]);
    // return userModel::update(["id"=>17, "gender"=>"男"]);
    // // ID放在后面，返回数据不含ID
    // return userModel::update(["gender"=>"男"], ["id"=>18]);
    // // 限制更新的内容，只允许gender被修改
    // return userModel::update(["gender"=>"男", "name"=>"可笑的人"], ["id"=>19], ["gender"]);
    return $user->id;
  }

  // 模型查询数据
  public function select()
  {
    $userModel = new UserModel();
    // 查询所有数据
    $user = $userModel::find(1);
    $user = $userModel::select();
    $user = $userModel::select([1, 3, 5]);

    // 也可以使用 where()方法进行条件筛选查询数据；
    $user = $userModel::where("id", "<", 5)->select();
    // 模型方法也可以使用 where 等连缀查询，和数据库查询方式一样；
    $user = $userModel::limit(3)->order("id", "desc")->select();
    // 模型支持聚合查询：max、min、sum、count、avg 等；
    $max = $userModel::max("id");
    // 模型也支持大量的快捷方式，这里演示一个：
    $user = $userModel::whereLike("name", "%王%")->select();

    $user = $userModel::withSearch(["name", "create_time"],
    [
        "name" => "张三",
        "create_time" => ["2022-1-1", "2025-10-20 23:59:59"],
        // "sort" => ["id", "desc"]
    ]
    
    )->select();

    return $user;
  }

  // 模型的字段设置
  public function field()
  {
    $userModel = new UserModel();
    // - 模型的数据字段和表字段是对应关系，默认会自动获取，包括字段的类型；
    // - 自动获取会导致增加一次查询，如果在模型中配置字段信息，会减少内存开销；
    // - 可以在模型设置$schema 字段，明确定义字段信息，字段需要对应表写完整；
    // - 字段类型的定义可以使用PHP类型或者数据库的字段类型都可以，以便自动绑定类型；
  }
    
  // 获取器
  public function getNameAttr()
  {
    $userModel = new UserModel();
    // $user = $userModel::select();
    // $status = $userModel -> find(1) -> getData('status');
    // echo $status;

    // 使用 withAttr 在控制器端实现动态获取器，比如让年龄+100岁；
    $user = UserModel::select()->withAttr("age", function ($value) {
        return $value + 100;
    });

    // return $userModel::getLastSql();
  }

}
